package com.emmmya.harinCheck.utils;

import com.emmmya.harinCheck.annotation.EnumGetValue;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

/**
 * EnumGetValue注解的解析器
 * @author laijieguan@sunwodao.com
 * @version 1.0
 * @date 2022-07-05 09:14:35
 */
public class EnumGetValueUtils {
    /**
     * 获取枚举类中，被@EnumGetValue修饰的方法
     * @param enumClass         枚举类紫姐嘛
     * @return 修饰的方法
     */
    public static Method getEnumMethod(Class<?> enumClass){
        try {
            Method[] declaredMethods = enumClass.getDeclaredMethods();
            for (int i = 0; i < declaredMethods.length; i++) {
                Method method = declaredMethods[i];
                //必须使用@EnumGetValue修饰
                EnumGetValue enumGetValue = method.getAnnotation(EnumGetValue.class);
                boolean isStatic = Modifier.isStatic(method.getModifiers());
                if(enumGetValue!= null && isStatic) {
                    return method;
                }
            }

        }catch (Exception e){

        }
        return null;
    }

    /**
     * 获取枚举类中，被@EnumGetValue修饰的方法
     * @param method         枚举类紫姐嘛
     * @param key
     * @return 修饰的方法
     */
    public static Object getEnumValue(Method method,Object key){
        try {
            Parameter[] parameters = method.getParameters();
            if(parameters!= null && parameters.length == 1){
                Parameter param = parameters[0];
                if(param.getType().isInstance(key)) {
                    return method.invoke(null, key);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     *
     * @param key
     * @return
     */
    public static Object getEnumValue(Class<?> enumClass,Object key){
        Method enumMethod = getEnumMethod(enumClass);
        if(enumMethod != null){
           return getEnumValue(enumMethod,key);
        }
        return null;
    }

}
